

package enterprise.jsf_jpa_war;

import enterprise.ent.Administradores;
import enterprise.ent.Country;
import enterprise.ent.Deportes;
import enterprise.ent.DeportesTiposLiga;
import enterprise.ent.Jugadores;
import enterprise.ent.Solicitudes;
import enterprise.ent.Torneos;
import enterprise.ent.Usuarios;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import javax.transaction.NotSupportedException;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;
import org.primefaces.event.FileUploadEvent;  
import org.primefaces.model.UploadedFile;  

    
/**
 * <p>A simple managed bean to mediate between the user
 * and the persistence layer.</p>
 * @author rlubke
 */
@Named
public class controlTorneos {
    /**
     * <p>The <code>PersistenceContext</code>.</p>
     */
    @PersistenceContext 
    private EntityManager em;
    
    /**
     * <p>The transaction resource.</p>
     */
    @Resource 
    private UserTransaction utx;
    
    
    public Long SolicitudAceptada;
    
    //variables TORNEOS
    public int torIdDeporte;
    public Long torLigaAdmin;
    public String torLigaTorneo;
    public Date torLigaFecalta;
    public int torLigaTipo;

    //variables TORNEO CREANDO/EDITANDO
    public Long etorIdLiga;
    public int etorIdDeporte;
    public Long etorLigaAdmin;
    public String etorLigaTorneo;
    public Date etorLigaFecalta;
    public int etorLigaTipo;
    
    
    public String pagina_creando_torneo_numero;
    public String pagina_creando_torneo;
    
    //LigaEstado
    //0 Activo
    //1 Creando
    //2 Pendiente de aprobacion
    //3 Bloqueado
    //4 Terminado
    //5 Eliminado antes de ser activado

    public String getPagina_creando_torneo_numero() {
        return pagina_creando_torneo_numero;
    }

    public void setPagina_creando_torneo_numero(String pagina_creando_torneo_numero) {
        this.pagina_creando_torneo_numero = pagina_creando_torneo_numero;
    }

    public String getPagina_creando_torneo() {
        return pagina_creando_torneo;
    }

    public void setPagina_creando_torneo(String pagina_creando_torneo) {
        this.pagina_creando_torneo = pagina_creando_torneo;
    }

    public Long getEtorIdLiga() {
        return etorIdLiga;
    }

    public void setEtorIdLiga(Long etorIdLiga) {
        this.etorIdLiga = etorIdLiga;
    }

    public int getEtorIdDeporte() {
        return etorIdDeporte;
    }

    public void setEtorIdDeporte(int etorIdDeporte) {
        this.etorIdDeporte = etorIdDeporte;
    }

    public Long getEtorLigaAdmin() {
        return etorLigaAdmin;
    }

    public void setEtorLigaAdmin(Long etorLigaAdmin) {
        this.etorLigaAdmin = etorLigaAdmin;
    }

    public String getEtorLigaTorneo() {
        return etorLigaTorneo;
    }

    public void setEtorLigaTorneo(String etorLigaTorneo) {
        this.etorLigaTorneo = etorLigaTorneo;
    }

    public Date getEtorLigaFecalta() {
        return etorLigaFecalta;
    }

    public void setEtorLigaFecalta(Date etorLigaFecalta) {
        this.etorLigaFecalta = etorLigaFecalta;
    }

    public int getEtorLigaTipo() {
        return etorLigaTipo;
    }

    public void setEtorLigaTipo(int etorLigaTipo) {
        this.etorLigaTipo = etorLigaTipo;
    }
    
    public List<Torneos> vListaTorneos;
    public List<DeportesTiposLiga> vListaDeportesTiposLiga;

    public List<DeportesTiposLiga> getvListaDeportesTiposLiga() {
        return vListaDeportesTiposLiga;
    }

    public void setvListaDeportesTiposLiga(List<DeportesTiposLiga> vListaDeportesTiposLiga) {
        this.vListaDeportesTiposLiga = vListaDeportesTiposLiga;
    }

    public int getTorIdDeporte() {
        return torIdDeporte;
    }

    public void setTorIdDeporte(int torIdDeporte) {
        this.torIdDeporte = torIdDeporte;
    }

    public Long getTorLigaAdmin() {
        return torLigaAdmin;
    }

    public void setTorLigaAdmin(Long torLigaAdmin) {
        this.torLigaAdmin = torLigaAdmin;
    }

    public String getTorLigaTorneo() {
        return torLigaTorneo;
    }

    public void setTorLigaTorneo(String torLigaTorneo) {
        this.torLigaTorneo = torLigaTorneo;
    }

    public Date getTorLigaFecalta() {
        return torLigaFecalta;
    }

    public void setTorLigaFecalta(Date torLigaFecalta) {
        this.torLigaFecalta = torLigaFecalta;
    }

    public int getTorLigaTipo() {
        return torLigaTipo;
    }

    public void setTorLigaTipo(int torLigaTipo) {
        this.torLigaTipo = torLigaTipo;
    }

    public List<Torneos> getvListaTorneos() {
        return vListaTorneos;
    }

    public void setvListaTorneos(List<Torneos> vListaTorneos) {
        this.vListaTorneos = vListaTorneos;
    }
    
    public void ir_alta_nuevo_torneo(Long idsolicitudaceptada){ 
        Map sMap;
        sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
        bm.spagina = "torneo/alta_nuevo_torneo";
        
        
        SolicitudAceptada = idsolicitudaceptada;
        
        System.out.println("pasa por eki alta nuevo torneo:" + bm.spagina );

    }
    
        
    public void createNuevoTorneo() {
        FacesContext context = FacesContext.getCurrentInstance();
        Torneos wtorneo = new Torneos();

        wtorneo.setIdDeporte(torIdDeporte);
        wtorneo.setLigaFecalta(new Date());
        wtorneo.setLigaTipo(torLigaTipo);
        wtorneo.setLigaTorneo(torLigaTorneo);
        wtorneo.setLigaEstado(1); //Creando
        
            try {
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                Usuarios usr = (Usuarios) sMap.get("user");
                Long IdCurrentUser = usr.getIdUsuario();
                System.out.println("usuario obtenido: " + IdCurrentUser);
                wtorneo.setLigaAdmin(IdCurrentUser);
                
//                System.out.println("NUEVA SOLICITUD -> SOLIC TIPO: " + solicTipo);
//                System.out.println("NUEVA SOLICITUD -> SOLIC USER: " + IdCurrentUser);
//                System.out.println("NUEVA SOLICITUD -> SOLIC DETALLE: " + solicDetalle);
//                System.out.println("NUEVA SOLICITUD -> SOLIC DETALLE: " + wsolic.getSolEstado());
                
                
                utx.begin();
                em.persist(wtorneo);
                
                
                //actualiza el estado de la solicitud aceptada para crear el torneo
                Solicitudes s = (Solicitudes)em.createNamedQuery("Solicitudes.findBySolId").
                setParameter("solId", SolicitudAceptada).getSingleResult();
                s.setSolEstado(10);
                
                utx.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "#{msg.torneo_creado}", String.class)
                        ,null);
                context.addMessage("creategrowl", message);
                
                //cambia el estado de la solicitud de alta de torneo
                //controlSolicitudes csol = new controlSolicitudes();
                //csol.actuEstadoSolicitud(SolicitudAceptada,10); 
                /*utx.begin();
                    Solicitudes s = (Solicitudes)
                    em.createNamedQuery("Solicitudes.findBySolId").
                        setParameter("solId", SolicitudAceptada).getSingleResult();
                    s.setSolEstado(10);
                utx.begin();*/
                
                
                
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
                bm.esAdmin = true;
                bm.spagina = "torneo/creando_torneo";
                
                //return "app-main";
                //return null;
            } catch (Exception e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating league!",
                                                        "Unexpected error when creating your league.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new league",
                                                e);
                //return null;
            }     
        }
    
        public void ir_creando_torneo(Long idLiga,Integer nopcion) {
                FacesContext context = FacesContext.getCurrentInstance();
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();

                Query query = em.createNamedQuery("Torneos.findByIdLiga");
                Long paramLike = idLiga;
                query.setParameter("idLiga", paramLike);
                Torneos eTorneo = (Torneos)query.getSingleResult();
                
                etorIdDeporte = eTorneo.getIdDeporte();
                etorIdLiga = idLiga;
                etorLigaAdmin = eTorneo.getLigaAdmin();
                etorLigaFecalta = eTorneo.getLigaFecalta();
                etorLigaTipo = eTorneo.getLigaTipo();
                etorLigaTorneo = eTorneo.getLigaTorneo();
                
                
                if(nopcion == 0){
                    pagina_creando_torneo = "creando_torneo_ajustes";
                    pagina_creando_torneo_numero = nopcion.toString(); }
                if(nopcion == 1){ 
                    pagina_creando_torneo = "creando_torneo_equipos";
                    pagina_creando_torneo_numero = nopcion.toString(); }
                if(nopcion == 2){
                    pagina_creando_torneo = "creando_torneo_jugadores";
                    pagina_creando_torneo_numero = nopcion.toString(); }
                if(nopcion == 3){
                    pagina_creando_torneo = "creando_torneo_calendario";
                    pagina_creando_torneo_numero = nopcion.toString(); }
                if(nopcion == 4){
                    pagina_creando_torneo = "creando_torneo_publicar";
                    pagina_creando_torneo_numero = nopcion.toString(); }
                
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
                bm.spagina = "torneo/creando_torneo";
        }
    
        public void ir_torneo(Long id, Integer estado) {
            //0 Activo
            //1 Creando
            //2 Pendiente de aprobacion
            //3 Bloqueado
            //4 Terminado
            //5 Eliminado antes de ser activado    
            //if(estado == 0 || tipo == 4){ ir_ver_torneo(id); }
            if(estado == 1){ ir_creando_torneo(id,0); }
            //if(estado == 2){ ir_pendiente_torneo(id); }
            //if(estado == 3){ ir_bloqueado_torneo(id); }
            
            
                
        }
        
        
    
        public List<Deportes> findAllDeportes() {
            Query query = em.createNamedQuery("Deportes.findAll");
            List<Deportes> tmpDeportes = query.getResultList();
            
            torIdDeporte = tmpDeportes.get(0).getIdDeporte();
            
            vListaDeportesTiposLiga = findAllTiposLiga();
            
            return tmpDeportes;
        }
        
        public List<DeportesTiposLiga> findAllTiposLiga(){
            Query query = em.createNamedQuery("DeportesTiposLiga.findByIdDeporte");
            Integer paramLike = torIdDeporte;
            query.setParameter("idDeporte", paramLike);
            List<DeportesTiposLiga> tmpDeportesTiposLiga = query.getResultList();
            return tmpDeportesTiposLiga;
        }
        
        public List<Torneos> findAllTorneosDeAdminMax3(Long AdminUser){
            Query query = em.createNamedQuery("Torneos.findByLigaAdminOrderByFecha");
            query.setParameter("ligaAdmin", AdminUser);
            query.setMaxResults(3);
            List<Torneos> tmpTorneos = query.getResultList();
            return tmpTorneos;
        }
        public List<Torneos> findAllTorneosDeAdmin(Long AdminUser){
            Query query = em.createNamedQuery("Torneos.findByLigaAdminOrderByFecha");
            query.setParameter("ligaAdmin", AdminUser);
            List<Torneos> tmpTorneos = query.getResultList();
            return tmpTorneos;
        }
        public boolean masDe3Torneos(Long AdminUser){
            Integer nT = findAllTorneosDeAdmin(AdminUser).size();
            if(nT > 3){
                return true;
            }else{
                return false;
            }
        }
        
        public String obtenerDeporteByID(Integer iddepor){
            
            Query query = em.createNamedQuery("Deportes.findByIdDeporte");
            query.setParameter("idDeporte", iddepor);
            Deportes tmpDeporte = (Deportes)query.getSingleResult();
            return tmpDeporte.getDepoDeporte().toString();
            
        }
        
        public void ir_ver_todos_torneos(Long adminUser){ 
            //try {
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                
                
                vListaTorneos = findAllTorneosDeAdmin(adminUser);
                System.out.println(vListaTorneos.size());
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                BeanMenu bm = (BeanMenu) sMap.get("beanMenu");
                bm.esAdmin = true;
                bm.spagina = "torneo/listado_torneos_admin"; 
            //} catch (NoResultException nre) {
                //return null;;
            //}
        }
        
        public String findLigaByTipoLiga(Integer idtipoliga){
            Query query = em.createNamedQuery("TiposLiga.findTipoByIdTipoLiga");
            Integer paramLike = idtipoliga;
            query.setParameter("idTipoLiga", paramLike);
            return query.getSingleResult().toString();
        }      
        
        private Integer getIdLigaPorNombre(String tnombre) {
            try {
                Torneos tor = (Torneos)
                em.createNamedQuery("Torneos.findByLigaTorneo").
                        setParameter("ligaTorneo", tnombre).getSingleResult();
                return tor.getIdLiga(); 
            } catch (NoResultException nre) {
                return null;
            }
        }
        
        private Torneos getTorneoPorId(Integer idTor) {
            try {
                Torneos tor = (Torneos)
                em.createNamedQuery("Torneos.findByIdLiga").
                        setParameter("idLiga", idTor).getSingleResult();
                return tor; 
            } catch (NoResultException nre) {
                return null;
            }
        }
        
        public void actuEstadoTorneo(Long idtor, Integer estado, Long adminUser) {
            System.out.println("actualizando TORNEO -> LIGA ID: " + idtor + " ---> a estado: " + estado);
            FacesContext context = FacesContext.getCurrentInstance();
            try{
                utx.begin();
                Torneos s = (Torneos)
                    em.createNamedQuery("Torneos.findByIdLiga").
                            setParameter("idLiga", idtor).getSingleResult();
                s.setLigaEstado(estado);
                utx.commit();
                
                //Carga la lista de solicitudes
                vListaTorneos = findAllTorneosDeAdmin(adminUser);
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Hecho!",  null);  
                FacesContext.getCurrentInstance().addMessage(null, message);
                
            } catch (Exception e) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                            "Error inesperado actualizando torneo!",
                                                            "Por favor contacta con el Administrador del sistema.");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Error inesperado actualizando torneo",
                                                e);
            }
        }
        
        public String getDescEstadoTorneo(Integer estadoTorneo){
            //0 Activo
            //1 Creando
            //2 Pendiente de aprobacion
            //3 Bloqueado
            //4 Terminado
            if(estadoTorneo == 0){ return "Activo"; }
            if(estadoTorneo == 1){ return "Creando"; }
            if(estadoTorneo == 2){ return "Pendiente de aprobacion"; }
            if(estadoTorneo == 3){ return "Bloqueado"; }
            if(estadoTorneo == 4){ return "Terminado"; }
            
            return "?";
            
        }
        public String getDescTipoTorneo(Integer tipoTorneo){
            //1	Liga a una vuelta
            //2	Liga a dos vueltas
            //3	Eliminatoria
            //4	Liguilla grupos y eliminatoria
	
            if(tipoTorneo == 1){ return "Liga a una vuelta"; }
            if(tipoTorneo == 2){ return "Liga a dos vueltas"; }
            if(tipoTorneo == 3){ return "Eliminatoria"; }
            if(tipoTorneo == 4){ return "Liguilla grupos y eliminatoria"; }
            
            return "?";
            
        }
        
    }
